package com.tbit.uqbike.webmanager.dao.core;


import com.tbit.uqbike.object.business.MachineImportInfo;
import com.tbit.uqbike.object.pojo.*;
import com.tbit.uqbike.object.pojo.bo.BatchMoveMachineBO;
import com.tbit.uqbike.object.pojo.dto.MachineSearchDTO;
import com.tbit.uqbike.object.pojo.dto.OperatingMachineDTO;
import com.tbit.uqbike.object.pojo.dto.OperatingMapMonitoringDTO;
import com.tbit.uqbike.object.pojo.vo.MachineStatusVO;
import com.tbit.uqbike.object.pojo.vo.OperatingMapMachineStatus;
import com.tbit.uqbike.object.pojo.vo.OperatingMonitorV2VO;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 设备dao
 *
 * @author Leon
 * 2017年2月24日 下午4:02:36
 */
public interface MachineDao {

    /**
     * 根据类型和用户名查询
     *
     * @param machineNO
     * @return
     */
    Machine getByMachineNO(String machineNO);

    /**
     * 根据类型和用户名查询
     *
     * @param userCode
     * @return
     */
    Machine getByUserCode(String userCode);

    /**
     * 根据设备id查询
     *
     * @param machineId
     * @return
     */
    Machine getByMachineId(Integer machineId);

    /**
     * 根据设备编号批量查询
     *
     * @param params
     * @return
     */
    List<Machine> getByMachineNOs(Map<String, Object> params);

    /**
     * 根据平台id和设备编号查询
     *
     * @param params
     * @return
     */
    List<Machine> getByAccountIdAndMachineNOs(Map<String, Object> params);

    int deleteByPrimaryKey(Integer machineid);

    int insert(Machine record);

    int insertSelective(Machine record);

    Machine selectByPrimaryKey(Integer machineid);

    Machine selectByUserCode(String userCode);

    Machine selectByMachineNO(String machineNO);

    Machine selectByKey(String key);

    int updateByPrimaryKeySelective(Machine record);

    int updateByPrimaryKey(Machine record);

    int batInsertMachine(Map<String, Object> map);

    List<String> cntMachineByMachineNO(@Param("list") List<String> list);

    List<String> cntMachineByUserCode(@Param("list") List<String> list);

    List<String> cntMachineByFrame(@Param("list") List<String> list);

    List<String> cntMachineByLicense(@Param("list") List<String> list);

    List<String> cntMachineByMotor(@Param("list") List<String> list);


    List<Integer> getMachineIdByMnos(@Param("list") List<String> list);

    int modMachineNO(Map<String, Object> map);

    int modUserCode(Map<String, Object> map);

    /**
     * 修改车架号等数据
     */
    void modFrame(Map<String, Object> map);

    List<MachineBaseInfo> searchMachine(Map<String, Object> map);

    /**
     * 查询单个设备字段是否存在
     */
    List<Machine> getExist(Map<String, Object> map);

    int cntSearchMachine(Map<String, Object> map);

    int batModMachineState(Map<String, Object> map);

    /**
     * 批量删除
     */
    void deleteBatch(Map<String, Object> map);

    /**
     * 统计品牌旗下车辆总数
     */
    Integer countByBID(Integer accountId);

    /**
     * 统计品牌旗下在线车辆总数
     */
    Integer countOnlineMachineByBid(@Param("accountId") Integer accountId, @Param("nowTime") String nowTime, @Param("offlineTime") Long offlineTime);

    /**
     * 按代理分组统计车辆总数
     */
    List<MoneyData> groupByAccountId(Map<String, Object> map);

    List<Machine> selectById(Integer accountId);

    List<Machine> checkUserCodeExist(@Param("userCode") List<String> userCode);

    List<Machine> checkMachineNoExist(@Param("machineNo") List<String> machineNo, @Param("accountId") Integer accountId);

    /**
     * 批量查询
     *
     * @param query .
     * @return .
     */
    List<Machine> selectBy(Map<String, Object> query);

    /**
     * 查看区域内所有车辆的电量
     */
    List<Map<String, Object>> getMachineSoc(Map<String, Object> map);

    /**
     * 查询今天之前的各区域车辆数
     *
     * @param time
     * @return
     */
    @MapKey("accountId")
    Map<Integer, Map> queryCountGroupByAccountId(@Param("time") Date time);

    /**
     * 查询区域下的车辆id
     *
     * @param accountIds
     * @return
     */
    List<Integer> selectMachineIdsByAccountIds(@Param("accountIds") List<Integer> accountIds);

    /**
     * 查询丢失车辆的id
     *
     * @param machineIds
     * @return
     */
    List<Integer> selectLoseMachineIds(@Param("machineIds") List<Integer> machineIds);

    /**
     * 未投放车辆id
     *
     * @param machineIds
     * @return
     */
    List<Integer> selectUnPutInMachineIds(@Param("machineIds") List<Integer> machineIds);

    /**
     * 使用中的车辆id
     *
     * @param machineIds
     * @return
     */
    List<Integer> selectIsUserMachineIds(@Param("machineIds") List<Integer> machineIds);

    /**
     * 故障车辆id
     *
     * @param machineIds
     * @return
     */
    List<Integer> selectFaultMachineIds(@Param("machineIds") List<Integer> machineIds);

    /**
     * 异常车辆(无信号/超区/电池异常)
     *
     * @param machineIds
     * @return
     */
    List<Integer> selectAbnormalMachineIds(@Param("machineIds") List<Integer> machineIds);

    /**
     * 缺电车辆
     *
     * @param machineIds
     * @return
     */
    List<Integer> selectPowerShortageMachineIds(@Param("machineIds") List<Integer> machineIds);

    /**
     * 查询车辆状态
     *
     * @param operatingMachineDTO .
     * @return .
     */
    List<OperatingMapMachineStatus> operatingMapMachineStatus(OperatingMachineDTO operatingMachineDTO);

    List<Machine> getByAccountId(Integer accountId);

    List<Machine> getByUserCodeList(List<String> userCodes);

    List<Machine> getByAccountIdAndUserCodes(Map<String, Object> param);

    List<Machine> getByMachineIdS(List<Integer> machineIds);

    /**
     * 批量查询
     * @param userCodeList 车辆编号
     * @return map
     */
    @MapKey("userCode")
    Map<String, Map<String, Object>> queryByUserCode(@Param("userCodeList") List<String> userCodeList);

    /**
     * 批量新增设备丢失记录
     * @param machineLoseList machineLose
     */
    void batchAddMachineLose(@Param("machineLoseList") List<MachineLose> machineLoseList);

    /**
     * 批量删除车辆丢失记录
     * @param userCodeList 车辆编号
     */
    void batchDelByUserCode(@Param("userCodeList") List<String> userCodeList);

    /**
     * 通过id列表批量查询车辆
     * @param ids 设备id列表
     * @return List<Machine>
     */
    List<Machine> getByIds(Set<Integer> ids);

    /**
     * 通过品牌id和区域id查询车辆
     * @param brandId 品牌id
     * @param accountId 区域id
     * @return List<Machine>
     */
    List<Machine> getByBrandIdAndAccountId(Integer brandId, Integer accountId);
 	/**
     * 更新车辆分组
     */
    void updateGroup(@Param("machineIds") List<Integer> machineIds, @Param("machineGroupId") Integer machineGroupId);

    /**
     * 检查运营区下是否有自行车
     * @param accountId 运营区ID
     * @return 只查询一条记录，检查是否存在
     */
    Machine checkIfExistBike(Integer accountId);

    /**
     * 批量划拨设备
     * @param batchMoveMachineBO 划拨信息
     */
    void batchMoveMachine(BatchMoveMachineBO batchMoveMachineBO);


    List<Machine> getMachinesByMachineInfos(@Param("userCodeList") List<String> userCodeList,
                                            @Param("frameList") List<String> frameList,
                                            @Param("licenseList") List<String> licenseList,
                                            @Param("motorList") List<String> motorList);

    int updateMachines(@Param("machineImportInfos") List<MachineImportInfo> machineImportInfos);

    List<MachineState> selectMachineIdsByAccountIdsV2(@Param("accountIds") List<Integer> accountIds, @Param("startId") Integer startId, @Param("limit") Integer limit);

    int deleteByUseCodes(@Param("startCode") String startCode, @Param("endCode") String endCode);

    List<Integer> getMachineBySite(@Param("startCode") String startCode, @Param("endCode") String endCode);


    /**
     * @description: 获取运行大屏---运营数据---车辆运营看板的所有状态的车辆数据
     * @author: mo.shanyong
     * @date: 2024/9/18 9:21
     * @return: java.util.Map<java.lang.String,java.lang.Integer>
     */
    Map<String,Integer> getStatData(@Param("accounIds") List<Integer> accounIds);

    /**
     * 获取在线车辆
     * @param mons 设备编号
     * @return map
     */
    @MapKey("machineNO")
    Map<String, MachineStatus> selectOnlineMachine(@Param("mons") List<String> mons);

    /**
     * 查询运营区异常数量
     * @param accountIds 区域id
     * @return result
     */
    List<MachineStatusVO> selectMachineAbnormal(@Param("accountIds") List<Integer> accountIds, @Param("regionId") List<Integer> regionId);

    /**
     * 查询运营区故障车辆数量
     * @param accountIds 区域id
     * @return result
     */
    Integer selectFaultCount(@Param("accountIds")List<Integer> accountIds, @Param("regionId") List<Integer> regionId);

    /**
     * 查询运营区低电车辆数量
     * @param accountIds 区域id
     * @return result
     */
    Integer selectLowBatteryCount(@Param("accountIds")List<Integer> accountIds, @Param("regionId") List<Integer> regionId);

    /**
     * 查询无定位车辆
     * @param accountIds 区域id
     * @return count
     */
    Integer selectWithoutCount(@Param("accountIds") List<Integer> accountIds, @Param("regionId") List<Integer> regionId);

    /**
     * 查询站外数量
     * @param accountIds 区域id
     * @return count
     */
    Integer selectOutSiteCount(@Param("accountIds")List<Integer> accountIds, @Param("regionId") List<Integer> regionId);


    List<MachineBaseInfo> searchMachineV2(MachineSearchDTO searchDTO);

    int cntSearchMachineV2(MachineSearchDTO searchDTO);

    /**
     * 通过车辆编号查询车辆信息
     * @param userCodes 车辆编号列表
     * @return result
     */
    List<Machine> selectByUserCodes(@Param("userCodes") List<String> userCodes, @Param("brandId") Integer brandId);

    /**
     * 修改车辆状态为正常
     * @param machineId 设备id
     */
    void updateNormalById(Integer machineId);

    /**
     * @description: 听过区域id获取区域下所有的车辆id
     * @author: mo.shanyong
     * @date: 2025/4/1 13:25
     * @param: accountIdList
     * @return: java.util.List<java.lang.String>
     */
    List<String> getUserCodesByAccountIds(@Param("accountIdList") List<Integer> accountIdList);

    /**
     * 根据类型查询已存在的编号
     * @param accountId 区域id
     * @param type 编号类型: 1:车辆编号,2:设备编号
     * @return
     */
    List<String> selectByAccountId(@Param("accountId") Integer accountId, @Param("type") Integer type, @Param("noList") List<String> noList);


    /**
     * 修改提醒状态
     * @param noList       编号列表
     * @param operateType  操作类型
     * @param type         编号类型
     */
    void updateRemindState(@Param("noList") List<String> noList, @Param("operateType")Integer operateType, @Param("type") Integer type);

    /**
     * 根据区域id查询车辆监控数据
     *
     * @param operatingMachineDTO .
     */
    List<OperatingMapMachineStatus> getMonitoringByAccountId(OperatingMachineDTO operatingMachineDTO);

    /**
     * 车辆监控-运营地图
     * @param dto dto
     * @return List<OperatingMapMachineStatus>
     */
    List<OperatingMonitorV2VO> operatingMapMonitoringV2(OperatingMapMonitoringDTO dto);
}
